// symbol

// symbol的值不会重复
let a = Symbol()
let b = Symbol()
console.log(a === b)

// symbol可保证对象的属性不被误覆盖
const cache = {}
cache[a] = 'a'
cache[b] = 'b'

console.log(cache)

// symbol可用来实现对象私有成员

const name = Symbol()
const person = {
  [name]: 'zce',
  say () {
    console.log(this[name])
  }
}

// 只对外暴露 person,外部文件拿不到name也就访问不到name成员,只能通过person调用
person.say()

// Symbol.for实现全局相同的Symbol -------------------------
// Symbol.for内部维护了一个全局注册表，维护字符串和symbol的一一对应关系

const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')
console.log(s1 === s2)

// 传入的非字符串会被转为字符串
console.log(Symbol.for(true) === Symbol.for('true'))

// Symbol 属性名获取 ---------------------------------------------------
// 常规方式获取不到对象的Symbol 属性名，需要使用getOwnPropertySymbols方法
const obj = {
  [Symbol('symbol value')]: 'symbol value',
  foo: 'normal value'
}

// for (var key in obj) {
//   console.log(key)
// }
// console.log(Object.keys(obj))
// console.log(JSON.stringify(obj))

console.log(Object.getOwnPropertySymbols(obj))
